/**
 * Universidad Del Valle De Guatemala.
 * Algoritmos y Estructuras de Datos.
 * Hoja de Trabajo 7
 * Miguel Enrique Zea Arenales.
 * Carné 09238.
 * 17/10/2012.
 * Descripción: Programa principal, que selecciona el tipo de palabras en un
 * archivo de textp. Elaborado por Eduardo Castellanos para el curso de  
 * Algoritmos y Estructuras de Datos 2011.
 */

package bsts;

import java.io.*;

class WordTypeCounter {
    public static void main(String[] args) throws Exception {
        /*String[] temp = new String[3];
        temp[0] = "C:/Users/Miguel Zea/Documents/NetBeansProjects/BSTs/src/bsts/words.txt";
        temp[1] = "C:/Users/Miguel Zea/Documents/NetBeansProjects/BSTs/src/bsts/text.txt";
        temp[2] = "4";
        args = temp;*/
	if(args.length > 1) {
            // Declaración e inicialización de variables.
            // el primer parametro indica el nombre del archivo con las definiciones de las palabras
            File wordFile = new File(args[0]);
			
            // el segundo parametro indica el nombre del archivo que tiene el texto a analizar
            File textFile = new File(args[1]);
			
            // el tercer parametro sirve para seleccionar la implementacion que se usara para
            // guardar el conjunto de palabras. Use el valor 1 para indicar que se empleara
            // la implementacion SimpleSet que acompaña esta tarea.
            // Para el resto de implementaciones: 
            //  2 Red Black Tree
            //  3 Splay Tree
            //  4 Hash Table
            //  5 JCF LinkedList
            //  6 JCF TreeSet
            //  7 JCF LinkedHashSet
            int implementacion = Integer.parseInt(args[2]);
			
            BufferedReader wordreader;
            BufferedReader textreader;
			
            int verbs=0;
            int nouns=0;
            int adjectives=0;
            int adverbs=0;
            int gerunds=0;
			
            long starttime;
            long endtime;
			
            // Verificar que los dos parámetros que se pasaron sean archivos que existen
            if(wordFile.isFile() && textFile.isFile()) {
                // Leer archivos
		try {
                    wordreader = new BufferedReader(new FileReader(wordFile));
                    textreader = new BufferedReader(new FileReader(textFile));
		} catch (Exception ex) {
                    System.out.println("Error al leer!");
                    return;
		}

		// Crear un WordSet para almacenar la lista de palabras
		// se selecciona la implementacion de acuerdo al tercer parametro pasado en la linea
		// de comando
		// =====================================================
		WordSet words =  WordSetFactory.generateSet(implementacion);
		// =====================================================
				
		String line = null;
		String[] wordParts;
				
		// leer el archivo que contiene las palabras y cargarlo al WordSet.
		starttime = System.currentTimeMillis();
		line = wordreader.readLine();
		while(line!=null) {
                    wordParts = line.split("\\.");  // lo que esta entre comillas es una expresión regular.
                    if(wordParts.length == 2) {
                        words.add(new Word(wordParts[0].trim(),wordParts[1].trim()));
                    }
                    line = wordreader.readLine();
		}
		wordreader.close();
		endtime = System.currentTimeMillis();
				
		System.out.println("Palabras cargadas en " + (endtime-starttime) + " ms.");
				
		// Procesar archivo de texto
		starttime = System.currentTimeMillis();
		line = textreader.readLine();
		String[] textParts;
		Word currentword;
		Word lookupword = new Word();
				
		while(line!=null) {
                    // Separar todas las palabras en la línea.
                    textParts = line.split("[^\\w-]+"); // utilizar de separador cualquier caracter que no sea una letra, número o guión.
					
                    // Revisar cada palabra y verificar de que tipo es. 
                    for(int i=0;i<textParts.length;i++) {
                        lookupword.setWord(textParts[i].trim().toLowerCase());
			currentword = words.get(lookupword);
			if(currentword != null) {
                            if(currentword.getType().equals("v-d") || currentword.getType().equals("v") || currentword.getType().equals("q"))
                                verbs++;
                            else if(currentword.getType().equals("g") )
                                gerunds++;
                            else if(currentword.getType().equals("a-s") || currentword.getType().equals("a-c") || currentword.getType().equals("a"))
                                adjectives++;
                            else if(currentword.getType().equals("e"))
                                adverbs++;
                            else 
                                nouns++;
			}
                    }
					
                    line = textreader.readLine();
		}
		textreader.close();
		endtime = System.currentTimeMillis();
		System.out.println("Texto analizado en " + (endtime-starttime) + " ms.");
				
		// Presentar estadísticas
		System.out.println("El texto tiene:");
		System.out.println(verbs + " verbos");
		System.out.println(nouns + " sustantivos");
		System.out.println(adjectives + " adjetivos");
		System.out.println(adverbs + " adverbios");
		System.out.println(gerunds + " gerundios");	
            } else {
                System.out.println("No encuentro los archivos :'( ");
            }
        } else {
            System.out.println("Faltan Parametros.");
	}
    }
}